#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
エクスポート アイテム アクセスコントロール ツールキット機能

Mikan Python Web Framework
"""

__author__ = "K.Sonohara"
__status__ = "develop"
__version__ = "0.0.0_36"
__date__    = "2014/01/05"
__license__ = 'LGPL'

# ------------------------------------------------------------
## インポート
# ------------------------------------------------------------
# Python
import traceback

# ESiPC

# Mikan
from mikan.idt import AbstractMikanItemDBToolkit
from mikan.core import MIKAN

# ------------------------------------------------------------
## 変数
# ------------------------------------------------------------

# ------------------------------------------------------------
## Mikan アクセス権 定義値
class MIKAN_IDT_AC(MIKAN):
	## 読み取り
	AC_READ = 0x01
	## 書き込み
	AC_WRITE = 0x02
	## 読み取りアクション
	AC_ACTION_READ = 0x04
	## 書き込みアクション
	AC_ACTION_WRITE = 0x08

	## 1桁目：管理者
	NUMBER_ADMIN = 0
	## 2桁目：所有者
	NUMBER_OWNER = 1
	## 3桁目：同一グループ
	NUMBER_GROUP = 2
	## 4桁目：全てのユーザ
	NUMBER_ALL = 3
	## *桁目：設定グループ
	NUMBER_CUSTOM = 4
	## 初期AC値
	DEFAULT_VALUE = 0xF
	DEFAULT_VALUES = 0xFFFF

# ------------------------------------------------------------
## 関数
# ------------------------------------------------------------

# ------------------------------------------------------------
## クラス
# ------------------------------------------------------------

# ------------------------------------------------------------
## Mikan 抽象アクセス権 クラス
class AbstractMikanACIDT(AbstractMikanItemDBToolkit, MIKAN_IDT_AC):
	## コンストラクタ
	# @param itemdb DBクラス
	def __init__(self, itemdb):
		super(AbstractMikanACIDT, self).__init__(itemdb)

	## アクセス権チェック
	# @param value 検証値
	# @param number 桁数
	# @param atype アクセス権タイプ
	# @return Trueならアクセス権あり
	def can(self, atype, number, values):
		# for debug
		if self.islogdebug:
			self.logger.debug(atype)
			self.logger.debug(number)
			self.logger.debug(values)

		if (number < 0) or (number > len(values)):
			return False


		try:
			n = values[number]
			return self.can_number(atype, int(n, 16))
		except:
			# for debug
			if self.islogdebug:
				self.logger.debug(traceback.format_exc())
			return False

	## アクセス権チェック(数値一桁のみ処理)
	# @param value 検証値
	# @param type アクセス権タイプ
	# @return Trueならアクセス権あり
	def can_number(self, atype, value):
		# for debug
		if self.islogdebug:
			self.logger.debug(atype)
			self.logger.debug(value)
		return (atype & value) == atype

# ------------------------------------------------------------
## Mikan アクセス権 クラス
class MikanACIDT(AbstractMikanACIDT):
	## コンストラクタ
	# @param itemdb DBクラス
	def __init__(self, itemdb):
		super(MikanACIDT, self).__init__(itemdb)

# ------------------------------------------------------------
## メイン関数
# ------------------------------------------------------------
if __name__ == '__main__':
	pass

# ------------------------------------------------------------
